﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using GSQ.BusinessEntities;
using GSQ.DataAccess.DataSetTableAdapters;

namespace GSQ.DataAccess
{
    public class NcDA
    {
        private void InicializarAdaptadores()
        {
            this.cnn = new SqlConnection(Connection.GetConnectionString);
            cnn.Open();
            this.tr = cnn.BeginTransaction();

            AdapterMaster.Connection = cnn;
            AdapterMaster.Transaction = tr;

            AdapterDetaill.Connection = cnn;
            AdapterDetaill.Transaction = tr;

            vAdapterMaster.Connection = cnn;
            vAdapterMaster.Transaction = tr;

            vAdapterDetaill.Connection = cnn;
            vAdapterDetaill.Transaction = tr;

            AdapterSecuencias.Connection = cnn;
            AdapterSecuencias.Transaction = tr;

            AdapterProductos.Connection = cnn;
            AdapterProductos.Transaction = tr;

            AdapterNcf.Connection = cnn;
            AdapterNcf.Transaction = tr;

            AdapterFacturasPagos.Connection = cnn;
            AdapterFacturasPagos.Transaction = tr;

            AdapterCotizaciones.Connection = cnn;
            AdapterCotizaciones.Transaction = tr;

            AdapterUtilidades.Connection = cnn;
            AdapterUtilidades.Transaction = tr;

            AdapterClientes.Connection = cnn;
            AdapterClientes.Transaction = tr;

            AdapterFacturas.Connection = cnn;
            AdapterFacturas.Transaction = tr;

            AdapterFacturasDetalles.Connection = cnn;
            AdapterFacturasDetalles.Transaction = tr;
        }

        #region Variables

        #region TableAdapters
        private NCTableAdapter AdapterMaster = new NCTableAdapter();
        private NC_DETALLESTableAdapter AdapterDetaill = new NC_DETALLESTableAdapter();
        private V_NCTableAdapter vAdapterMaster = new V_NCTableAdapter();
        private V_NC_DETALLESTableAdapter vAdapterDetaill = new V_NC_DETALLESTableAdapter();
        private SECUENCIASTableAdapter AdapterSecuencias = new SECUENCIASTableAdapter();
        private PRODUCTOSTableAdapter AdapterProductos = new PRODUCTOSTableAdapter();
        private NCFTableAdapter AdapterNcf = new NCFTableAdapter();
        private FACTURAS_PAGOSTableAdapter AdapterFacturasPagos = new FACTURAS_PAGOSTableAdapter();
        private COTIZACIONESTableAdapter AdapterCotizaciones = new COTIZACIONESTableAdapter();
        private UTILIDADESTableAdapter AdapterUtilidades = new UTILIDADESTableAdapter();
        private CLIENTESTableAdapter AdapterClientes = new CLIENTESTableAdapter();
        private FACTURASTableAdapter AdapterFacturas = new FACTURASTableAdapter();
        private FACTURAS_DETALLESTableAdapter AdapterFacturasDetalles = new FACTURAS_DETALLESTableAdapter();
        #endregion

        private DataSet.NCDataTable entitiesMaster;
        private DataSet.NC_DETALLESDataTable entitiesDetaill;
        private DataSet.SECUENCIASRow entitySecuencia;
        private DataSet.NCFRow entityNcf;
        private DataSet.NCRow entityMaster;
        private DataSet.NC_DETALLESRow entityDetaill;
        private DataSet.FACTURAS_PAGOSDataTable entitiesFacturasPagos;
        private DataSet.FACTURASDataTable entitiesFacturas;
        private DataSet.FACTURAS_DETALLESDataTable entitiesFacturasDetalles;
        private SqlConnection cnn = null;
        private SqlTransaction tr = null;
        #endregion

        public decimal Insert(NC value)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion

                #region Obtener y Ajustar secuencias
                if (value.FACTURAS.ID_NCF == 1)//Buscar y ajustar valores de secuencias
                {
                    this.entitySecuencia = this.AdapterSecuencias.GetDataByID(10).FirstOrDefault();
                    this.AdapterSecuencias.SecuenciasUpdateCommand(10);
                    this.entityNcf = this.AdapterNcf.GetDataByID(10).FirstOrDefault();//Obtener valores de secuencias NCF
                    this.AdapterNcf.NcfUpdateValueCommnadByID(10);//Actualizar valores secuencias NCF
                }
                else
                {
                    if (value.FACTURAS.ID_CONDICION == 1)//Si la factura es de credito
                    {
                        this.entitySecuencia = this.AdapterSecuencias.GetDataByID(11).FirstOrDefault();//Buscar la secuencia para facturas de credito donde su ID = 2 
                        this.AdapterSecuencias.SecuenciasUpdateCommand(11);//Actualizar valor de secuencia
                        this.entityNcf = this.AdapterNcf.GetDataByID(11).FirstOrDefault();//Obtener valores de secuencias NCF
                        this.AdapterNcf.NcfUpdateValueCommnadByID(11);//Actualizar valores secuencias NCF
                    }
                    else
                    {
                        this.entitySecuencia = this.AdapterSecuencias.GetDataByID(12).FirstOrDefault();//Buscar la secuencia para facturas de contado donde su ID = 3
                        this.AdapterSecuencias.SecuenciasUpdateCommand(12);//Actualizar valor de secuencia
                        this.entityNcf = this.AdapterNcf.GetDataByID(12).FirstOrDefault();//Obtener valores de secuencias NCF
                        this.AdapterNcf.NcfUpdateValueCommnadByID(12);//Actualizar valores secuencias NCF
                    }

                    if (entityNcf.VALUE >= entityNcf.HASTA)//Validar Disponibilidad de NCF
                        throw new Exception(string.Format("No es posible generar está nota de credito con este <<TIPO DE NCF>> ya que no quedan secuencias de NCF disponibles{0}{0}Informe a contabilidad para que la soliciten a DGII", Environment.NewLine));
                }
                #endregion

                #region Preparar Encabezado
                entitiesMaster = new DataSet.NCDataTable(); // Inicializo la tabla principal 
                entityMaster = entitiesMaster.NewNCRow(); // Inicializo la fila principal apartir de la tabla principal

                entityMaster.NRO_DOCUMENTO = entitySecuencia.VALUE + 1;// Asigno el valor de secuencia mas 1
                entityMaster.ID_NCF = entityNcf.ID;

                entityMaster.ID_TIPO = value.ID_TIPO;
                entityMaster.ID_CLIENTE = value.ID_CLIENTE;
                entityMaster.ID_VENDEDOR = value.ID_VENDEDOR;
                entityMaster.ID_USUARIO = value.ID_USUARIO;
                entityMaster.ID_FACTURA = value.FACTURAS.ID;
                entityMaster.SEQ_NCF = entityNcf.VALUE + 1;
                entityMaster.FECHA = value.FECHA;
                entityMaster.ACTIVO = true;
                if (value.OBSERVACIONES != null && value.OBSERVACIONES != string.Empty)
                    entityMaster.OBSERVACIONES = value.OBSERVACIONES;
                if (this.entityNcf.IMPUESTOS)
                    entityMaster.T_IMPUESTO = value.T_IMPUESTO;
                else
                    entityMaster.T_IMPUESTO = 0;
                entityMaster.T_DESCUENTO = value.T_DESCUENTO;
                entityMaster.M_TOTAL = value.M_TOTAL;
                entitiesMaster.AddNCRow(entityMaster); //Agrego la fila principal a la tabla principal 
                this.AdapterMaster.Update(this.entitiesMaster);
                value.ID = entityMaster.ID;
                #endregion

                #region Ajustar Montos de Clientes
                if (value.FACTURAS.ID_CONDICION == 1)
                {
                    DataSet.CLIENTESRow rwCliente = AdapterClientes.GetDataByID(value.ID_CLIENTE).FirstOrDefault();
                    rwCliente.MONTO_ADEUDADO -= value.M_TOTAL;
                    AdapterClientes.Update(rwCliente);
                }
                #endregion

                #region Ajustar monto pagado de facturas
                this.entitiesFacturas = this.AdapterFacturas.GetDataByID(value.ID_FACTURA);
                this.entitiesFacturas.FirstOrDefault().M_PAGADO += value.M_TOTAL;
                this.AdapterFacturas.Update(this.entitiesFacturas);
                #endregion

                #region Preparar Detalle
                if (value.FACTURAS.FACTURAS_DETALLES.Count > 0)
                {
                    entitiesDetaill = new DataSet.NC_DETALLESDataTable();
                    this.entitiesFacturasDetalles = this.AdapterFacturasDetalles.GetDataByID(value.ID_FACTURA);
                    foreach (NC_DETALLES rw in value.NC_DETALLES)
                    {
                        entityDetaill = entitiesDetaill.NewNC_DETALLESRow();

                        AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD, rw.ID_PRODUCTO);//Ajustar stock de productos
                        this.entitiesFacturasDetalles.Where(a => a.ID_PRODUCTO == rw.ID_PRODUCTO).FirstOrDefault().C_DEVUELTA += rw.CANTIDAD;//Ajuster las cantidades devueltas en facturas

                        entityDetaill.ID = entityMaster.ID;
                        entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
                        entityDetaill.CANTIDAD = rw.CANTIDAD;
                        entityDetaill.COSTO = rw.COSTO;
                        entityDetaill.PRECIO = rw.PRECIO;
                        entityDetaill.DESCUENTO = rw.DESCUENTO;
                        entityDetaill.X_DESCUENTO = rw.X_DESCUENTO;
                        if (entityNcf.IMPUESTOS)// Determinando si por el tipo  de ncf se agregan los impuestos
                        {
                            entityDetaill.IMPUESTO = rw.IMPUESTO;
                            entityDetaill.X_IMPUESTO = rw.X_IMPUESTO;
                        }
                        else
                        {
                            entityDetaill.IMPUESTO = 0;
                            entityDetaill.X_IMPUESTO = 0;
                        }

                        entitiesDetaill.AddNC_DETALLESRow(entityDetaill);
                    }
                    this.AdapterFacturasDetalles.Update(this.entitiesFacturasDetalles);
                    this.AdapterDetaill.Update(this.entitiesDetaill);
                }
                #endregion

                this.tr.Commit();
            }
            catch
            {
                if (InternalOpen)
                    tr.Rollback();
                throw;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
            return value.ID;
        }

        public decimal Update(NC newValue, NC oldValue)
        {
            throw new NotImplementedException();
            //using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            //{
            //    try
            //    {
            //        cnn.Open(); // abro la conexion
            //        AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal

            //        SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion
            //        AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal

            //        entitiesMaster = this.AdapterMaster.GetDataByID(oldValue.ID);
            //        entityMaster = this.entitiesMaster.FirstOrDefault(); // Inicializo la fila principal apartir de la tabla principal

            //        entityMaster.ID_CONDICION = newValue.ID_CONDICION;
            //        entityMaster.TIPO = newValue.TIPO;
            //        entityMaster.ID_USUARIO = newValue.ID_USUARIO;
            //        entityMaster.FECHA = newValue.FECHA;
            //        entityMaster.F_VENCIMIENTO = newValue.F_VENCIMIENTO;
            //        entityMaster.ID_SUPLIDOR = newValue.ID_SUPLIDOR;
            //        entityMaster.NRO_FACTURA = newValue.NRO_FACTURA;
            //        if (newValue.NCF != null && newValue.NCF != string.Empty)
            //            entityMaster.NCF = newValue.NCF;
            //        if (newValue.OBSERVACIONES != null && newValue.OBSERVACIONES != string.Empty)
            //            entityMaster.OBSERVACIONES = newValue.OBSERVACIONES;
            //        entityMaster.ACTIVO = newValue.ACTIVO;

            //        try
            //        {
            //            AdapterMaster.Update(entitiesMaster); // Ejecuto la operacion de update para insertar el encabezado 

            //            AdapterDetaill.Connection = cnn; // Asigno la conexion al tableAdapter de detalle 
            //            AdapterDetaill.Transaction = tr; // Asigno la transaccion al tableAdapter de detalle                        

            //            DataSet.UTILIDADESRow utilidades = new DataSetTableAdapters.UTILIDADESTableAdapter { Connection = cnn, Transaction = tr }.GetData().FirstOrDefault();

            //            AdapterProductos.Connection = cnn;
            //            AdapterProductos.Transaction = tr;


            //            DataSet.COMPRAS_DETALLESDataTable comprasDetalles = AdapterDetaill.GetDataByID(oldValue.ID);
            //            foreach (DataSet.COMPRAS_DETALLESRow r in comprasDetalles)
            //            {
            //                AdapterProductos.ProductosUpdateExistencia((r.CANTIDAD * -1), r.ID_PRODUCTO);
            //            }
            //            AdapterDetaill.DeleteByID(oldValue.ID);
            //            entitiesDetaill = new DataSet.COMPRAS_DETALLESDataTable();

            //            foreach (COMPRAS_DETALLES rw in newValue.COMPRAS_DETALLES)
            //            {
            //                entityDetaill = entitiesDetaill.NewCOMPRAS_DETALLESRow();
            //                AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD, rw.ID_PRODUCTO);
            //                DataSet.PRODUCTOSRow producto = AdapterProductos.GetDataByID(rw.ID_PRODUCTO).FirstOrDefault();
            //                entityDetaill.COSTO_ANTERIOR = producto.COSTO;
            //                entityDetaill.PRECIO_ANTERIOR = producto.PRECIO;
            //                if (utilidades.AJUSTAR_PRECIOS_COSTO_COMPRAS)
            //                {
            //                    producto.COSTO = rw.COSTO;
            //                    producto.PRECIO = rw.COSTO + ((rw.COSTO * producto.X_GANANCIA) / 100);
            //                    AdapterProductos.Update(producto);
            //                }



            //                entityDetaill.ID = entityMaster.ID;
            //                entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
            //                entityDetaill.CANTIDAD = rw.CANTIDAD;
            //                entityDetaill.COSTO = rw.COSTO;
            //                entityDetaill.PRECIO = rw.PRECIO;
            //                entityDetaill.DESCUENTO = rw.DESCUENTO;
            //                entityDetaill.X_DESCUENTO = rw.X_DESCUENTO;
            //                entityDetaill.IMPUESTO = rw.IMPUESTO;
            //                entityDetaill.X_IMPUESTO = rw.X_IMPUESTO;
            //                entityDetaill.C_DEVUELTA = rw.C_DEVUELTA;
            //                entitiesDetaill.AddCOMPRAS_DETALLESRow(entityDetaill);
            //            }
            //            AdapterDetaill.Update(entitiesDetaill);
            //            tr.Commit();
            //        }
            //        catch (Exception ex)
            //        {
            //            tr.Rollback();
            //            throw ex;
            //        }

            //        newValue.ID = entityMaster.ID;
            //        return newValue.ID;
            //    }
            //    finally
            //    {
            //        if (cnn.State != System.Data.ConnectionState.Closed)
            //            cnn.Close();
            //    }
            //}
        }

        public NC GetById(decimal id)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion

                DataSet.V_NCRow rw = this.vAdapterMaster.GetDataByID(id).FirstOrDefault();
                NC nc = null;
                if (rw != null)
                {
                    nc = GetEntity(rw, vAdapterDetaill.GetDataByID(rw.ID));
                    if (nc != null)
                        nc.FACTURAS = new FacturasDA().GetById(nc.ID_FACTURA);
                }
                return nc;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetAll()
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion

                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetData())
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetByFechas(DateTime value1, DateTime value2)
        {

            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion
                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetDataByFechas(value1.Date, value2.Date))
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetByCliente(decimal id)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion
                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetDataByIdCliente(id))
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetByCliente(string value)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion
                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetDataByCliente(value.Trim()))
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetByNroFactura(decimal nroFactura)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion
                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetDataByNroFactura(nroFactura))
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetByIdFactura(decimal id)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion
                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetDataByIdFactura(id))
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        public List<NC> GetByNroDocumento(decimal nroDoc)
        {
            bool InternalOpen = false;
            try
            {
                #region Inicializar Metodo
                if (this.cnn == null)
                {
                    InternalOpen = true;
                    InicializarAdaptadores();
                }
                #endregion
                List<NC> list = new List<NC>();
                foreach (DataSet.V_NCRow rw in vAdapterMaster.GetDataByNroDocumento(nroDoc))
                {
                    list.Add(GetEntity(rw, null));
                }
                return list;
            }
            finally
            {
                if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                    this.cnn.Close();
            }
        }

        private NC GetEntity(DataSet.V_NCRow rwMaster, DataSet.V_NC_DETALLESDataTable tdDetaill)
        {
            NC nc = null;
            if (rwMaster != null)
            {
                nc = new NC();
                nc.ID = rwMaster.ID;
                nc.ID_TIPO = rwMaster.ID_TIPO;
                nc.NC_TIPO = new NC_TIPOS { ID = rwMaster.ID_TIPO, TIPO = rwMaster.TIPO };
                nc.ID_NCF = rwMaster.ID_NCF;
                nc.NCF = new NCF { ID = rwMaster.ID, DESCRIPCION = rwMaster.DESCRIPCION_NCF, NCF1 = rwMaster.NCF };
                nc.ID_CLIENTE = rwMaster.ID_CLIENTE;
                nc.CLIENTES = new CLIENTES { ID = rwMaster.ID_CLIENTE, CLIENTE = rwMaster.CLIENTE };
                nc.ID_VENDEDOR = rwMaster.ID_VENDEDOR;
                nc.VENDEDORES = new VENDEDORES { ID = rwMaster.ID_VENDEDOR, VENDEDOR = rwMaster.VENDEDOR };
                nc.ID_USUARIO = rwMaster.ID_USUARIO;
                nc.USUARIOS = new USUARIOS { ID = rwMaster.ID_USUARIO, NOMBRE_USUARIO = rwMaster.USUARIO };
                nc.ID_FACTURA = rwMaster.ID_FACTURA;
                nc.NRO_DOCUMENTO = rwMaster.NRO_DOCUMENTO;
                nc.SEQ_NCF = rwMaster.SEQ_NCF;
                nc.FECHA = rwMaster.FECHA;
                if (!rwMaster.IsOBSERVACIONESNull())
                    nc.OBSERVACIONES = rwMaster.OBSERVACIONES;
                nc.ACTIVO = rwMaster.ACTIVO;
                nc.T_DESCUENTO = rwMaster.T_DESCUENTO;
                nc.T_IMPUESTO = rwMaster.T_IMPUESTO;
                nc.M_TOTAL = rwMaster.M_TOTAL;
                nc.M_PENDIENTE = rwMaster.M_PENDIETE;
                nc.M_UTILIZADO = rwMaster.M_UTILIZADO;
                nc.NRO_FACTURA = rwMaster.NRO_FACTURA;
                nc.CONDICION = rwMaster.CONDICION;
                if (tdDetaill != null)
                {
                    nc.FACTURAS = new FacturasDA().GetById(rwMaster.ID_FACTURA);
                    foreach (DataSet.V_NC_DETALLESRow rw in tdDetaill)
                    {
                        if (rw != null)
                        {
                            NC_DETALLES ncdetalle = new NC_DETALLES();
                            ncdetalle.ID = rw.ID;
                            ncdetalle.ID_PRODUCTO = rw.ID_PRODUCTO;
                            ncdetalle.PRODUCTOS = new PRODUCTOS { ID = rw.ID_PRODUCTO, CODIGO = rw.CODIGO };
                            ncdetalle.MEDIDAS = new MEDIDAS { ID = rw.ID_MEDIDA, MEDIDA = rw.MEDIDA };
                            ncdetalle.DESCRIPCIONES = new DESCRIPCIONES { ID = rw.ID_DESCRIPCION, DESCRIPCION = rw.DESCRIPCION };
                            ncdetalle.CANTIDAD = rw.CANTIDAD;
                            ncdetalle.COSTO = rw.COSTO;
                            ncdetalle.PRECIO = rw.PRECIO;
                            ncdetalle.DESCUENTO = rw.DESCUENTO;
                            ncdetalle.X_DESCUENTO = rw.X_DESCUENTO;
                            ncdetalle.IMPUESTO = rw.IMPUESTO;
                            ncdetalle.X_IMPUESTO = rw.X_IMPUESTO;
                            nc.NC_DETALLES.Add(ncdetalle);
                        }
                    }
                }
            }
            return nc;
        }

        public bool Anular(NC entity)
        {
            if (entity.ACTIVO)
            {
                bool InternalOpen = false;
                try
                {
                    #region Inicializar Metodo
                    if (this.cnn == null)
                    {
                        InternalOpen = true;
                        InicializarAdaptadores();
                    }
                    #endregion

                    #region Operaciones con encabezado
                    this.entityMaster = this.AdapterMaster.GetDataByID(entity.ID).FirstOrDefault();
                    this.entityMaster.ACTIVO = false;
                    this.AdapterMaster.Update(this.entityMaster);
                    #endregion

                    #region Operaciones con encabezado facturas
                    this.entitiesFacturas = this.AdapterFacturas.GetDataByID(entity.ID_FACTURA);
                    this.entitiesFacturas.FirstOrDefault().M_PAGADO -= this.entityMaster.M_TOTAL;
                    this.AdapterFacturas.Update(this.entitiesFacturas);

                    #endregion

                    #region Operaciones con clientes
                    if (this.entitiesFacturas.FirstOrDefault().ID_CONDICION == 1)
                    {
                        DataSet.CLIENTESRow rwCliente = AdapterClientes.GetDataByID(entity.ID_CLIENTE).FirstOrDefault();
                        rwCliente.MONTO_ADEUDADO -= entity.M_TOTAL;
                        AdapterClientes.Update(rwCliente);
                    }
                    #endregion

                    #region Operaciones con detalles
                    this.entitiesDetaill = this.AdapterDetaill.GetDataByID(entity.ID);
                    if (entitiesDetaill.Rows.Count > 0)
                    {
                        this.entitiesFacturasDetalles = this.AdapterFacturasDetalles.GetDataByID(entity.ID_FACTURA);
                        foreach (DataSet.NC_DETALLESRow rw in this.entitiesDetaill)
                        {
                            this.AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD * -1, rw.ID_PRODUCTO);//Actualizar existencia de productos
                            this.entitiesFacturasDetalles.Where(a => a.ID_PRODUCTO == rw.ID_PRODUCTO).FirstOrDefault().C_DEVUELTA -= rw.CANTIDAD;//Ajuster las cantidades devueltas en facturas
                        }
                    #endregion
                        this.AdapterFacturasDetalles.Update(this.entitiesFacturasDetalles);
                    }
                    entity.ACTIVO = false;
                    tr.Commit();
                    return true;
                }
                catch
                {
                    if (InternalOpen)
                        tr.Rollback();
                    throw;
                }
                finally
                {
                    if (InternalOpen && this.cnn.State != System.Data.ConnectionState.Closed)
                        this.cnn.Close();
                }
            }
            else
                return false;
        }
    }
}
